extern int ia64_hyperprivop(unsigned long, REGS *);
extern int ia64_hypercall(struct pt_regs *regs);
extern void vmx_do_launch(struct vcpu *);
+extern unsigned long lookup_domain_mpa(struct domain *,unsigned long);
extern unsigned long dom0_start, dom0_size;
#define PSCB(x,y) VCPU(x,y)
#define PSCBX(x,y) x->arch.y
-extern unsigned long vcpu_verbose;
-
-long do_iopl(domid_t domain, unsigned int new_io_pl)
-{
- dummy();
- return 0;
-}
-
#include <xen/sched-if.h>
-extern struct schedule_data schedule_data[NR_CPUS];
-
void schedule_tail(struct vcpu *prev)
{
context_saved(prev);
{
struct domain *d = current->domain;
unsigned long mask, pteval2, mpaddr;
- unsigned long lookup_domain_mpa(struct domain *,unsigned long);
- extern struct domain *dom0;
- extern unsigned long dom0_start, dom0_size;
// FIXME address had better be pre-validated on insert
mask = ~itir_mask(itir);
// given a current domain metaphysical address, return the physical address
unsigned long translate_domain_mpaddr(unsigned long mpaddr)
{
- extern unsigned long lookup_domain_mpa(struct domain *,unsigned long);
unsigned long pteval;
if (current->domain == dom0) {
void foodpi(void) {}
-unsigned long pending_false_positive = 0;
+static unsigned long pending_false_positive = 0;
void reflect_extint(struct pt_regs *regs)
{
void
do_ssc(unsigned long ssc, struct pt_regs *regs)
{
- extern unsigned long lookup_domain_mpa(struct domain *,unsigned long);
unsigned long arg0, arg1, arg2, arg3, retval;
char buf[2];
/**/ static int last_fd, last_count; // FIXME FIXME FIXME
vcpu_increment_iip(current);
}
+/* Also read in hyperprivop.S */
int first_break = 1;
void
ia64_handle_break (unsigned long ifa, struct pt_regs *regs, unsigned long isr, unsigned long iim)
{
- struct domain *d = (struct domain *) current->domain;
+ struct domain *d = current->domain;
struct vcpu *v = current;
- extern unsigned long running_on_sim;
if (first_break) {
if (platform_is_hp_ski()) running_on_sim = 1;
first_break = 0;
}
if (iim == 0x80001 || iim == 0x80002) { //FIXME: don't hardcode constant
- if (running_on_sim) do_ssc(vcpu_get_gr(current,36), regs);
- else do_ssc(vcpu_get_gr(current,36), regs);
+ do_ssc(vcpu_get_gr(current,36), regs);
}
#ifdef CRASH_DEBUG
else if ((iim == 0 || iim == CDB_BREAK_NUM) && !user_mode(regs)) {
}
}
+/* Used in vhpt.h. */
#define INTR_TYPE_MAX 10
UINT64 int_counts[INTR_TYPE_MAX];
extern void setreg(unsigned long regnum, unsigned long val, int nat, struct pt_regs *regs);
extern void panic_domain(struct pt_regs *, const char *, ...);
extern int set_metaphysical_rr0(void);
+extern unsigned long translate_domain_pte(UINT64,UINT64,UINT64);
+extern unsigned long translate_domain_mpaddr(unsigned long);
+extern void ia64_global_tlb_purge(UINT64 start, UINT64 end, UINT64 nbits);
+
typedef union {
struct ia64_psr ia64_psr;
unsigned long i64;
} PSR;
-//typedef struct pt_regs REGS;
-//typedef struct domain VCPU;
-
// this def for vcpu_regs won't work if kernel stack is present
//#define vcpu_regs(vcpu) ((struct pt_regs *) vcpu->arch.regs
#define PSCB(x,y) VCPU(x,y)
return IA64_NO_FAULT;
}
-extern UINT64 vcpu_check_pending_interrupts(VCPU *vcpu);
#define SPURIOUS_VECTOR 0xf
IA64FAULT vcpu_set_psr_dt(VCPU *vcpu)
}
}
-void early_tick(VCPU *vcpu)
-{
- UINT64 *p = &PSCBX(vcpu,irr[3]);
- printf("vcpu_check_pending: about to deliver early tick\n");
- printf("&irr[0]=%p, irr[0]=0x%lx\n",p,*p);
-}
-
#define IA64_TPR_MMI 0x10000
#define IA64_TPR_MIC 0x000f0
{
if (val & 0xff00) return IA64_RSVDREG_FAULT;
PSCB(vcpu,tpr) = val;
+ /* This can unmask interrupts. */
if (vcpu_check_pending_interrupts(vcpu) != SPURIOUS_VECTOR)
PSCB(vcpu,pending_interruption) = 1;
return (IA64_NO_FAULT);
VCPU translation register access routines
**************************************************************************/
-static void vcpu_purge_tr_entry(TR_ENTRY *trp)
+static inline void vcpu_purge_tr_entry(TR_ENTRY *trp)
{
trp->p = 0;
}
void foobar(void) { /*vcpu_verbose = 1;*/ }
-extern struct domain *dom0;
-
void vcpu_itc_no_srlz(VCPU *vcpu, UINT64 IorD, UINT64 vaddr, UINT64 pte, UINT64 mp_pte, UINT64 logps)
{
unsigned long psr;
IA64FAULT vcpu_itc_d(VCPU *vcpu, UINT64 pte, UINT64 itir, UINT64 ifa)
{
unsigned long pteval, logps = itir_ps(itir);
- unsigned long translate_domain_pte(UINT64,UINT64,UINT64);
BOOLEAN swap_rr0 = (!(ifa>>61) && PSCB(vcpu,metaphysical_mode));
if (logps < PAGE_SHIFT) {
IA64FAULT vcpu_itc_i(VCPU *vcpu, UINT64 pte, UINT64 itir, UINT64 ifa)
{
unsigned long pteval, logps = itir_ps(itir);
- unsigned long translate_domain_pte(UINT64,UINT64,UINT64);
BOOLEAN swap_rr0 = (!(ifa>>61) && PSCB(vcpu,metaphysical_mode));
// FIXME: validate ifa here (not in Xen space), COULD MACHINE CHECK!
// TODO: Only allowed for current vcpu
UINT64 mpaddr, paddr;
IA64FAULT fault;
- unsigned long translate_domain_mpaddr(unsigned long);
fault = vcpu_tpa(vcpu, vadr, &mpaddr);
if (fault == IA64_NO_FAULT) {
IA64FAULT vcpu_ptc_ga(VCPU *vcpu,UINT64 vadr,UINT64 addr_range)
{
- extern void ia64_global_tlb_purge(UINT64 start, UINT64 end, UINT64 nbits);
// FIXME: validate not flushing Xen addresses
// if (Xen address) return(IA64_ILLOP_FAULT);
// FIXME: ??breaks if domain PAGE_SIZE < Xen PAGE_SIZE